﻿using B.S.BaseData.Domain.Base;
using B.S.BaseData.Domain.LogTable;
using B.S.BaseData.Domain.MeetTable;
using B.S.BaseData.Domain.RBAC;
using B.S.BaseData.Domain.Interfaces;
using Microsoft.EntityFrameworkCore;

namespace B.S.BaseData.Domain
{
	public class BaseDataDbContext : DbContext
	{
		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="options"></param>
		public BaseDataDbContext(DbContextOptions options) : base(options)
		{
		}
		#region RBAC实体
		//用户信息
		public DbSet<UserInfo> UserInfo { get; set; }
		//角色
		public DbSet<Role> Role { get; set; }
		//用户角色
		public DbSet<UserRole> UserRole { get; set; }
		//权限
		public DbSet<Permission> Permission { get; set; }
		//角色权限
		public DbSet<RolePermission> RolePermission { get; set; }
		#endregion

		#region 会议信息实体
		//会议信息
		public DbSet<Meet> Meets { get; set; }
		//会议室信息
		public DbSet<MeetingRoom> MeetingRoom { get; set; }
		//会议类型
		public DbSet<MeetType> MeetType { get; set; }
		//会议室位置
		public DbSet<RoomAddress> RoomAddress { get; set; }

		#endregion

		#region 日志信息实体
		//审批日志
		public DbSet<ApprovalLog> ApprovalLog { get; set; }
		//登录日志
		public DbSet<LoginLog> LoginLog { get; set; }

		#endregion

		#region  基础数据
		//部门信息
		public DbSet<Department> Department { get; set; }
		//审批类型
		public DbSet<ApprovalType> ApprovalType { get; set; } 
		#endregion



		#region 软删除拦截器
		/// <summary>
		/// 测试用软删除实体DbSet属性
		/// </summary>
		/// <remarks>
		/// 用于演示和测试软删除功能的实体集合
		/// 虚拟属性(virtual)允许EF Core在运行时生成代理
		/// </remarks>
		public virtual DbSet<SoftDeleteEntity> TestEntities { get; set; }

		/// <summary>
		/// 配置数据模型
		/// </summary>
		/// <param name="modelBuilder">模型构建器</param>
		/// <remarks>
		/// 重写此方法以配置模型创建时的特殊规则：
		/// 1. 为<see cref="SoftDeleteEntity"/>自动添加查询过滤器，
		///    只返回未删除(IsDelete==false)的记录
		/// 2. 调用基类方法完成基础模型配置
		/// </remarks>
		protected override void OnModelCreating(ModelBuilder modelBuilder)
		{
			// 配置软删除实体的全局查询过滤器
			modelBuilder.Entity<SoftDeleteEntity>()
				.HasQueryFilter(a => a.IsDelete == false);

			// 调用基类方法完成基础配置
			base.OnModelCreating(modelBuilder);
		}

		#endregion

	}
	/// <summary>
	/// 支持软删除功能的实体基类
	/// </summary>
	/// <remarks>
	/// 实现<see cref="ISoftDeleteEntityWithDeleted"/>接口，
	/// 提供基础的软删除功能，所有需要软删除的实体类可继承此类
	/// </remarks>
	public class SoftDeleteEntity : ISoftDeleteEntityWithDeleted
	{
		/// <summary>
		/// 实体ID (主键)
		/// </summary>
		public int Id { get; set; }

		/// <summary>
		/// 实体名称 (默认值"test")
		/// </summary>
		public string Name { get; set; } = "test";

		/// <summary>
		/// 软删除标记
		/// </summary>
		/// <value>
		/// true表示已删除，false表示未删除
		/// </value>
		public bool IsDelete { get; set; }
	}
}
